package com.co.notaweb.beans;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.event.PhaseId;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import com.co.notaweb.constantes.ConstantesMsg;
import com.co.notaweb.entities.Asignacion;
import com.co.notaweb.entities.Curso;
import com.co.notaweb.entities.Docente;
import com.co.notaweb.facade.IColegioFacadeLocal;
import com.co.notaweb.util.Constants;
import com.co.notaweb.util.FacesUtils;
import com.co.notaweb.util.SelectUtil;
import com.co.notaweb.util.ServiceLocator;
import com.icesoft.faces.component.ext.RowSelectorEvent;

/**
 * @author PC
 * @version 1.0
 * @created 13-nov-2011 12:14:26
 */
public class IngresoAsignacionBean {
	private IColegioFacadeLocal colegioFacade;
	private List<SelectItem> listaColegio;
	private List<SelectItem> listaCursos;
	private List<SelectItem> listaMaterias;
	private List<SelectItem> listaDocente;

	private long idColegio;
	private long idCurso;
	private long idMateria;
	private long idDocente;

	private long intensidad;
	private String descripcion;

	private List<Asignacion> asignaciones;

	private Asignacion asignacion;

	private int idAsignacion;

	/**
	 * logrobean
	 * 
	 * @return
	 */
	@PostConstruct
	private void init() {
		try {
			colegioFacade = (IColegioFacadeLocal) new ServiceLocator()
					.getServiceLocal(Constants.FACADECOLEGIO);

			listaColegio = SelectUtil.buildColegiosItems(colegioFacade
					.consultarAllColegios());

			listaMaterias = SelectUtil.buildMateriasItems(colegioFacade
					.consultarAllMaterias());

			listaCursos = SelectUtil.buildCursosItems(new ArrayList<Curso>());

			listaDocente = SelectUtil
					.buildDocenteItems(new ArrayList<Docente>(),true);

			asignaciones = colegioFacade.consultarAllAsignacion();

			asignacion = new Asignacion();

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private void limpiarForm() {
		intensidad = 0;
		idAsignacion = 0;
		idColegio = 0;
		idCurso = 0;
		idDocente = 0;
		idMateria = 0;
		descripcion = "";
		asignacion = new Asignacion();
		init();
	}

	/**
	 ******************************************************************************************************************** 
	 * Actions
	 ******************************************************************************************************************** 
	 */

	public String guardar() {
		try {

			if (!validarForm() || asignacion == null) {
				FacesUtils
						.addErrorMessageBundle(ConstantesMsg.COMMON_REQUIRED_VALUE);
				return "";
			}
			asignacion.setIntensidad(intensidad);
			asignacion.setDescripcion(descripcion);
			colegioFacade.editAsignacion(asignacion, idColegio, idCurso,
					idDocente, idMateria);
			FacesUtils.addSuccesMessageBundle(ConstantesMsg.COMMON_SUCCES);

		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
		limpiarForm();
		return "";
	}

	public String nuevo() {
		limpiarForm();
		return "";
	}

	public String crear() {
		try {
			if (!validarForm()) {
				FacesUtils
						.addErrorMessageBundle(ConstantesMsg.COMMON_REQUIRED_VALUE);
				return "";
			}
			asignacion.setIntensidad(intensidad);
			asignacion.setDescripcion(descripcion);
			colegioFacade.createAsignacion(asignacion, idColegio, idCurso,
					idDocente, idMateria);
			FacesUtils.addSuccesMessageBundle(ConstantesMsg.COMMON_SUCCES);
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
		limpiarForm();
		return "";
	}

	public String eliminar() {
		try {
			colegioFacade.deleteAsignacion(asignacion.getId());
			FacesUtils.addSuccesMessageBundle(ConstantesMsg.COMMON_SUCCES);
		} catch (Exception e) {
			FacesUtils.addErrorMessageBundle(ConstantesMsg.COMMON_ERROR);
			e.printStackTrace();
		}
		limpiarForm();
		return "";
	}

	/**
	 ******************************************************************************************************************** 
	 * Event Listners
	 ******************************************************************************************************************** 
	 */

	public void rowAsignacionSelectionListener(RowSelectorEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
			return;
		}
		asignacion = asignaciones.get(event.getRow());
		idColegio = asignacion.getColegio().getId();

		refreshList();

		idCurso = asignacion.getCurso().getId();
		idDocente = asignacion.getDocente().getId();
		idMateria = asignacion.getMateria().getId();
		intensidad = asignacion.getIntensidad();
		descripcion = asignacion.getDescripcion();
	}

	public void selectColegioListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
			return;
		}

		refreshList();
	}

	public void selectCursoListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
			return;
		}
	}

	public void selectMateriaListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
			return;
		}

	}

	public void selectDocenteListener(ValueChangeEvent event) {
		if (event.getPhaseId() != PhaseId.INVOKE_APPLICATION) {
			event.setPhaseId(PhaseId.INVOKE_APPLICATION);
			event.queue();
			return;
		}

	}

	/**
	 ******************************************************************************************************************** 
	 * Private Methods
	 ******************************************************************************************************************** 
	 */

	private void refreshList() {
		listaCursos = SelectUtil.buildCursosItems(colegioFacade
				.consultarCursosPorColegio(idColegio));

		listaDocente = SelectUtil.buildDocenteItems(colegioFacade
				.consultarDocentePorColegio(idColegio),true);
	}

	private boolean validarForm() {
		if (idColegio == 0) {
			return false;
		}
		if (idCurso == 0) {
			return false;
		}
		if (idDocente == 0) {
			return false;
		}
		if (idMateria == 0) {
			return false;
		}
		return true;
	}

	/**
	 ******************************************************************************************************************** 
	 * Getters And Setters
	 ******************************************************************************************************************** 
	 */

	public List<SelectItem> getListaColegio() {
		return listaColegio;
	}

	public void setListaColegio(List<SelectItem> listaColegio) {
		this.listaColegio = listaColegio;
	}

	public List<SelectItem> getListaCursos() {
		return listaCursos;
	}

	public void setListaCursos(List<SelectItem> listaCursos) {
		this.listaCursos = listaCursos;
	}

	public List<SelectItem> getListaMaterias() {
		return listaMaterias;
	}

	public void setListaMaterias(List<SelectItem> listaMaterias) {
		this.listaMaterias = listaMaterias;
	}

	public List<SelectItem> getListaDocente() {
		return listaDocente;
	}

	public void setListaDocente(List<SelectItem> listaDocente) {
		this.listaDocente = listaDocente;
	}

	public long getIdColegio() {
		return idColegio;
	}

	public void setIdColegio(long idColegio) {
		this.idColegio = idColegio;
	}

	public long getIdCurso() {
		return idCurso;
	}

	public void setIdCurso(long idCurso) {
		this.idCurso = idCurso;
	}

	public long getIdMateria() {
		return idMateria;
	}

	public void setIdMateria(long idMateria) {
		this.idMateria = idMateria;
	}

	public long getIdDocente() {
		return idDocente;
	}

	public void setIdDocente(long idDocente) {
		this.idDocente = idDocente;
	}

	public long getIntensidad() {
		return intensidad;
	}

	public void setIntensidad(long intensidad) {
		this.intensidad = intensidad;
	}

	public String getDescripcion() {
		return descripcion;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public List<Asignacion> getAsignaciones() {
		return asignaciones;
	}

	public void setAsignaciones(List<Asignacion> asignaciones) {
		this.asignaciones = asignaciones;
	}

	public Asignacion getAsignacion() {
		return asignacion;
	}

	public void setAsignacion(Asignacion asignacion) {
		this.asignacion = asignacion;
	}

	public int getIdAsignacion() {
		return idAsignacion;
	}

	public void setIdAsignacion(int idAsignacion) {
		this.idAsignacion = idAsignacion;
	}

}